/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador.analisadorSintatico.comandos;

import compilador.analisadorLexico.*;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;

/**
 * @author João Matos
 */
public class CMD extends Producao {

    @Override
    public SimboloGramatical derivar() throws Exception {
        TokenReader tokenReader =  TokenReader.getInstance();
        
        Producao p = null;

        Token t = tokenReader.seeCurrent();
        if (t.getAtributo().equals(PalavraReservada.IF)){
            p = new IF();
            ((NaoTerminal) simbolo).add(p.derivar());
            return simbolo;
        }else if(t.getAtributo().equals(PalavraReservada.WHILE)){
            p = new WHILE();
            ((NaoTerminal) simbolo).add(p.derivar());
            return simbolo;
        }else if(t.getAtributo().equals(PalavraReservada.BREAK)){
            p = new BREAK();
            ((NaoTerminal) simbolo).add(p.derivar());
            return simbolo;
        }else if(t.getTokenClass().equals(TokenClass.IDENTIFICADOR)
                || t.getTokenClass().equals(TokenClass.NUMERO)
                || t.getTokenClass().equals(PalavraReservada.RETURN)
                || t.getAtributo().equals(PalavraReservada.WRITE)
                || t.getAtributo().equals(PalavraReservada.READ)
                || t.getAtributo().equals("(")
                || t.getAtributo().equals("-")){
            
            ((NaoTerminal) simbolo).add(new CMD_SEQUENCIAL().derivar());
            return simbolo;
        }else{
            tokenReader.consome();
            erro("Não é um comando válido");
            
            return simbolo;
        }
    }

    @Override
    public void setSimbolo() {
        simbolo = new NaoTerminal("CMD_SEQUENCIAL");
    }

}
